
#include <config.h>
#include <render.h>
#include <stdlib.h>

static T_Layout g_atMainPageIconsLayout[] = {
	{0, 0, 0, 0, "browse_mode.bmp"},
	{0, 0, 0, 0, "camera.bmp"},
	{0, 0, 0, 0, "continue_mod.bmp"},
	{0, 0, 0, 0, "setting.bmp"},
	{0, 0, 0, 0, NULL},
};

static T_PageLayout g_tMainPageLayout = {
	.iMaxTotalBytes = 0,
	.atLayout       = g_atMainPageIconsLayout,
};


/**********************************************************************
 * 函数名称： CalcMainPageLayout
 * 功能描述： 计算页面中各图标座标值
 * 输入参数： 无
 * 输出参数： ptPageLayout - 内含各图标的左上角/右下角座标值
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void  CalcMainPageLayout(PT_PageLayout ptPageLayout)
{
	int iStartY;
	int iWidth;
	int iHeight;
	int iXres, iYres, iBpp;
	int iTmpTotalBytes;
	PT_Layout atLayout;

	atLayout = ptPageLayout->atLayout;
	GetDispResolution(&iXres, &iYres, &iBpp);
	ptPageLayout->iBpp = iBpp;
	
	int iCount = 0; // 按钮个数
    iCount = sizeof(g_atMainPageIconsLayout) / sizeof(g_atMainPageIconsLayout[0]) - 1;

	/*   
	 *    ----------------------
	 *                           1/2 * iHeight
	 *          browse_mode.bmp  iHeight
	 *                           1/2 * iHeight
	 *         continue_mod.bmp     iHeight
	 *                           1/2 * iHeight
	 *          setting.bmp       iHeight
	 *                           1/2 * iHeight
	 *    ----------------------
	 */
	 
	iHeight = iYres * 2 / (iCount * 3 + 1);
	iWidth  = iHeight;
	iStartY = iHeight / 2;

	for(int i = 0; i < iCount; i++){
		atLayout[i].iTopLeftY  = i > 0 ? atLayout[i-1].iBotRightY + iHeight / 2 + 1 : iStartY;
		atLayout[i].iBotRightY = atLayout[i].iTopLeftY + iHeight - 1;
		atLayout[i].iTopLeftX  = (iXres - iWidth * 2) / 2;
		atLayout[i].iBotRightX = atLayout[i].iTopLeftX + iWidth * 2 - 1;

		iTmpTotalBytes = (atLayout[i].iBotRightX - atLayout[i].iTopLeftX + 1) * (atLayout[i].iBotRightY - atLayout[i].iTopLeftY + 1) * iBpp / 8;
		if (ptPageLayout->iMaxTotalBytes < iTmpTotalBytes)
		{
			ptPageLayout->iMaxTotalBytes = iTmpTotalBytes;
		}
	}


}


/**********************************************************************
 * 函数名称： ShowMainPage
 * 功能描述： 显示"主页面"
 * 输入参数： ptPageLayout - 内含多个图标的文件名和显示区域
 * 输出参数： 无
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void ShowMainPage(PT_PageLayout ptPageLayout)
{
	PT_VideoMem ptVideoMem;
	int iError;

	PT_Layout atLayout = ptPageLayout->atLayout;
		
	/* 1. 获得显存 */
	ptVideoMem = GetVideoMem(ID("main"), 1);
	if (ptVideoMem == NULL)
	{
		DBG_PRINTF("can't get video mem for main page!\n");
		return;
	}

	/* 2. 描画数据 */

	/* 如果还没有计算过各图标的坐标 */
	if (atLayout[0].iTopLeftX == 0)
	{
		CalcMainPageLayout(ptPageLayout);
	}

	iError = GeneratePage(ptPageLayout, ptVideoMem);	
	(void)iError;

	/* 3. 刷到设备上去 */
	FlushVideoMemToDev(ptVideoMem);

	/* 4. 解放显存 */
	PutVideoMem(ptVideoMem);

	// 刷新显示鼠标
	int iX, iY;
	GetMousePos(&iX, &iY);
	FreeMouseBox();
	SwitchRegionInDev(iX, iY, GetMouseIconPixelDatas(), GetMouseBox());
}


/**********************************************************************
 * 函数名称： MainPageGetInputEvent
 * 功能描述： 为"主页面"获得输入数据,判断输入事件位于哪一个图标上
 * 输入参数： ptPageLayout - 内含多个图标的显示区域
 * 输出参数： ptInputEvent - 内含得到的输入数据
 * 返 回 值： -1     - 输入数据不位于任何一个图标之上
 *            其他值 - 输入数据所落在的图标(PageLayout->atLayout数组的哪一项)
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static int MainPageGetInputEvent(PT_PageLayout ptPageLayout, PT_InputEvent ptInputEvent)
{
	return GenericGetInputEvent(ptPageLayout, ptInputEvent);
}


/**********************************************************************
 * 函数名称： MainPageRun
 * 功能描述： "主页面"的运行函数: 显示菜单图标,根据用户输入作出反应
 * 输入参数： ptParentPageParams - 未用
 * 输出参数： 无
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void MainPageRun(PT_PageParams ptParentPageParams)
{
	int iIndex;
	T_InputEvent tInputEvent;
	int bPressed = 0;
	int iIndexPressed = -1;
    T_PageParams tPageParams;

    tPageParams.iPageID = ID("main");

	/* 1. 显示页面 */
	ShowMainPage(&g_tMainPageLayout);

	/* 2. 创建Prepare线程 */

	/* 3. 调用GetInputEvent获得输入事件，进而处理 */
	while (1)
	{
		iIndex = MainPageGetInputEvent(&g_tMainPageLayout, &tInputEvent);
		if (tInputEvent.iPressure == 0)
		{
			/* 如果是松开 */
			if (bPressed)
			{
				/* 曾经有按钮被按下 */
				ReleaseButton(&g_atMainPageIconsLayout[iIndexPressed]);
				bPressed = 0;

				if (iIndexPressed == iIndex) /* 按下和松开都是同一个按钮 */
				{
					// 鼠标在按钮内，刷新显示
					SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());
					switch (iIndexPressed)
					{
						case 0: /* 浏览按钮 */
						{
							Page("browse")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						case 1: /* 相机按钮 */
						{
							Page("video")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						case 2: /* 连播按钮 */
						{
                            /* 设置tPageParams.strCurPictureFile[0] = '\0'
                             * 这样就会使用默认的播放目录
                             */
                            tPageParams.strCurPictureFile[0] = '\0';
							Page("auto")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						case 3: /* 设置按钮 */
						{
							Page("setting")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						default:
						{
							break;
						}
					}
				}
				
				iIndexPressed = -1;
			}
		}
		else if (tInputEvent.iPressure > 0)
		{
			/* 按下状态 */
			if (iIndex != -1)
			{
				if (!bPressed)
				{
					/* 未曾按下按钮 */
					bPressed = 1;
					iIndexPressed = iIndex;
					PressButton(&g_atMainPageIconsLayout[iIndexPressed]);
					// 按下按钮时，鼠标位于按钮内，刷新显示
					SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());
				}
			}
		}		
	}
}

static T_PageAction g_tMainPageAction = {
	.name          = "main",
	.Run           = MainPageRun,
	.GetInputEvent = MainPageGetInputEvent,
	//.Prepare       = MainPagePrepare;
};


/**********************************************************************
 * 函数名称： MainPageInit
 * 功能描述： 注册"主页面"
 * 输入参数： 无
 * 输出参数： 无
 * 返 回 值： 0 - 成功, 其他值 - 失败
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
int MainPageInit(void)
{
	return RegisterPageAction(&g_tMainPageAction);
}

